﻿using System;

namespace holysheng.Conver
{
    // 文件名字符串转换工具
    public class ConverFileNameToString
    {
        /*-----------------------------------------------------
          文件夹路径的格式为
          C:\Program Files\Common
          最后是不加\号的
        -----------------------------------------------------*/

        /// <summary>
        /// 输入文件名全路径，返回转换后的文件路径字符串
        /// </summary>
        /// <param name="fileAllName">带文件名和后缀的全路径</param>
        /// <param name="fileOnlyPath">返回文件路径</param>
        /// <param name="fileOnlyName">返回不带反缀名的文件名</param>
        /// <param name="fileOnlyType">返回带.的后缀名</param>
        public static void GetFileStr(string fileAllName, out string fileOnlyPath, out string fileOnlyName, out string fileOnlyType)
        {
            fileOnlyPath = fileAllName.Substring(0, fileAllName.LastIndexOf('\\')) + "\\"; // 文件路径
            fileOnlyName = fileAllName.Substring(fileAllName.LastIndexOf('\\') + 1, fileAllName.LastIndexOf('.') - fileAllName.LastIndexOf('\\') - 1); // 文件名
            fileOnlyType = fileAllName.Substring(fileAllName.LastIndexOf('.')); // 文件类型
        }

        /// <summary>
        /// 输入文件名全路径，得到文件名
        /// </summary>
        /// <param name="fileAllName">带文件名和后缀的全路径</param>
        /// <param name="fileOnlyName">返回不带反缀名的文件名</param>
        public static void GetFileOnlyName(string fileAllName, out string fileOnlyName)
        {
            fileOnlyName = fileAllName.Substring(fileAllName.LastIndexOf('\\') + 1, fileAllName.LastIndexOf('.') - fileAllName.LastIndexOf('\\') - 1); // 文件名
        }

        /// <summary>
        /// 输入文件名全路径，得到文件名
        /// </summary>
        /// <param name="fileAllName">带文件名和后缀的全路径</param>
        /// <returns>带扩展名的文件名</returns>
        public static string GetFileOnlyName(string fileAllName)
        {
            return fileAllName.Substring(fileAllName.LastIndexOf('\\') + 1, fileAllName.LastIndexOf('.') - fileAllName.LastIndexOf('\\') - 1); // 文件名
        }

        /// <summary>
        /// 输入文件名全路径，得到带.的后缀名
        /// </summary>
        /// <param name="fileAllName">带文件名和后缀的全路径</param>
        /// <param name="fileOnlyType">返回带.的后缀名</param>
        public static void GetFileOnlyType(string fileAllName, out string fileOnlyType)
        {
            fileOnlyType = fileAllName.Substring(fileAllName.LastIndexOf('.')); // 文件类型
        }

        /// <summary>
        /// 输入文件名全路径，返回带.的后缀名
        /// </summary>
        /// <param name="fileAllName">带文件名和后缀的全路径</param>
        /// <returns>带.的后缀名</returns>
        public static string GetFileOnlyType(string fileAllName)
        {
            return fileAllName.Substring(fileAllName.LastIndexOf('.')); // 文件类型
        }

        /// <summary>
        /// 输入文件名全路径，得到文件路径
        /// </summary>
        /// <param name="fileAllName">带文件名和后缀的全路径</param>
        /// <param name="fileOnlyPath">返回文件路径</param>
        public static void GetFileOnlyPath(string fileAllName, out string fileOnlyPath)
        {
            fileOnlyPath = fileAllName.Substring(0, fileAllName.LastIndexOf('\\')) + "\\"; // 文件路径
        }

        /// <summary>
        /// 输入文件名全路径，得到文件路径
        /// </summary>
        /// <param name="fileAllName">带文件名和后缀的全路径</param>
        /// <returns>文件路径</returns>
        public static string GetFileOnlyPath(string fileAllName)
        {
            return fileAllName.Substring(0, fileAllName.LastIndexOf('\\')) + "\\"; // 文件路径
        }

        /// <summary>
        /// 得到文件名和类型
        /// </summary>
        /// <param name="fileAllName">带文件名和后缀的全路径</param>
        /// <param name="fileOnlyName">返回不带反缀名的文件名</param>
        /// <param name="fileOnlyType">返回带.的后缀名</param>
        public static void GetFileNameAndType(string fileAllName, out string fileOnlyName, out string fileOnlyType)//得到文件名和类型
        {
            fileOnlyName = fileAllName.Substring(fileAllName.LastIndexOf('\\') + 1, fileAllName.LastIndexOf('.') - fileAllName.LastIndexOf('\\') - 1); // 文件名
            fileOnlyType = fileAllName.Substring(fileAllName.LastIndexOf('.')); // 文件类型
        }

        /// <summary>
        /// 得到目录名
        /// </summary>
        /// <param name="directory">目录总路径</param>
        /// <returns>返回目录名</returns>
        public static string GetDirectoryName(string directory)
        {
            string outDirectory;
            if (directory.Length - 1 == directory.LastIndexOf('\\')) // 如果是根目录
            {
                outDirectory = directory.Substring(0, directory.LastIndexOf(":")) + "盘";// 根目录，则返回 D盘
            }
            else
            {
                outDirectory = directory.Substring(directory.LastIndexOf('\\') + 1);// 返回D:/abc/cde
            }
            return outDirectory;
        }
    }

    public class ConverToChinese
    {
        /// <summary>
        /// 数字转中文
        /// </summary>
        /// <param name="num">数字</param>
        /// <param name="cnNum">中文或其它语言的数组（如：one,two,three,four。。。）</param>
        /// <param name="cnSBQ">十百千数组（原理同上）</param>
        /// <param name="cnWY">万、亿数组（这样就支持任何语言了。例：萬、億）</param>
        /// <returns>返回格式化好的字符串</returns>
        public static string ConvertNumberToChinese(string num, string[] cnNum, string[] cnSBQ, string[] cnWY)
        {
            string sRetun = ""; // 返回值 
            int pos = 0; // 字符位置指针 
            int mo = num.Length % 4; // 取模 

            // 四位一组得到组数 
            int zuShu = (mo > 0 ? num.Length / 4 + 1 : num.Length / 4);

            // 外层循环在所有组中循环 
            // 从左到右 高位到低位 四位一组 逐组处理 
            // 每组最后加上一个单位: "[万亿]","[亿]","[万]" 
            for (int i = zuShu; i > 0; i--)
            {
                int weiShu = 4;// 四位一组
                if (i == zuShu && mo != 0)// 如果是最前面一组（最大的一组），并且模不等于0
                {
                    weiShu = mo;// 最前面一组时，取模
                }
                // 得到一组四位数 最高位组有可能不足四位 
                string tempStrings = num.Substring(pos, weiShu);
                int sLength = tempStrings.Length;

                // 内层循环在该组中的每一位数上循环 从左到右 高位到低位 
                for (int j = 0; j < sLength; j++)
                {
                    // 处理改组中的每一位数加上所在位: "仟","佰","拾",""(个) 
                    int n = Convert.ToInt32(tempStrings.Substring(j, 1));
                    if (n == 0)
                    {
                        if (j < sLength - 1
                && Convert.ToInt32(tempStrings.Substring(j + 1, 1)) > 0
                && !sRetun.EndsWith(cnNum[n])) // 如果该0不是该组数字最后一位 并且 前一位大于0 并且 不是全部数字最后一位
                        {
                            sRetun += cnNum[n];
                        }
                    }
                    else
                    {
                        // 处理 1013 一千零"十三", 1113 一千一百"一十三" 
                        if (!(n == 1 && (sRetun.EndsWith(cnNum[0]) | sRetun.Length == 0) && j == sLength - 2)) // 非（如果该数是1 且 是第一次运算 或者 返回数的长度为0） 且 该数是第二位
                        {
                            sRetun += cnNum[n];
                        }
                        sRetun += cnSBQ[sLength - j - 1];
                    }
                }
                pos += weiShu;
                // 每组最后加上一个单位: [万],[亿] 等 
                if (i < zuShu) // 不是最高位的一组 
                {
                    if (Convert.ToInt32(tempStrings) != 0)
                    {
                        // 如果所有 4 位不全是 0 则加上单位 [万],[亿] 等 
                        sRetun += cnWY[i - 1];
                    }
                }
                else
                {
                    // 处理最高位的一组,最后必须加上单位 
                    sRetun += cnWY[i - 1];
                }
            }
            return sRetun;
        }
    }
}
